package n93_Fork_Join线程池;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;

import static utils.Sleeper.sleep;

/**
 * @author fu
 * @date 2022-04-07 21:57
 * 概要：
 *  ---------------------------------------------------------------
 * |                                                              |
 * |    Fork/Join 分治思想，适用于能够进行 任务拆分的 CPU密集型运算     |
 * |                                                             |
 * |=============================================================
 */
@Slf4j(topic = "c.T1")
public class T1_test_ForkJoin_串行 {

    public static void main(String[] args) {
        // 1. 创建线程池对象
        final ForkJoinPool pool = new ForkJoinPool(4); // 如果 无参 就是使用CPU核心数为 线程池线程数量

        final Integer res = pool.invoke(new MyTask(5));

        System.out.println(res);
    }
}

/**
 * 1~n 之间的整数求和 ------ 用 [递归]
 *  有返回值 继承 RecursiveTask
 *  没返回值 继承 RecursiveAction
 */
@Slf4j(topic = "c.MT")
class MyTask extends RecursiveTask<Integer>{

    private int n;

    public MyTask(int n) {
        this.n = n;
    }

    @Override
    protected Integer compute() {

        sleep(1);// ------------------------ 进入 等待 --------------------------
        // 终止条件
        if (n == 1) {
            log.debug("join() {}", n);
            return 1;
        }

        // 拆分
        final MyTask obj = new MyTask(n - 1);

        // 让一个 [线程（来自于ForkJoinPool）] 去执行
        obj.fork();
        log.debug("fork() {} + {}", n, obj);

        // 结果 - [阻塞等待 下面拆分任务的执行结果]
        final Integer join = obj.join();
        log.debug("join() {} + {} = {}", n, obj, n + join);

        // 求和
        return n + join;
    }

    @Override
    public String toString() {
        return "{" + n + '}';
    }
}








